home *** CD-ROM | disk | FTP | other *** search
- ;
- ; EXPERT.VL : Prolog òùâGâLâXâpü[âgâVâXâeâÇ
- ;
- ; ô┴ÆÑ
- ; âpâ^ü[âôâ}âbâ`âôâOü{âoâbâNâgâëâbâNé╠é▌
- ; Prolog é¬ö⌡éªé─éóéΘægé▌ì₧é▌ÅqîΩé═Ä└æòé╡é─éóé╚éó
- ; ïKæÑé═æ«É½âèâXâg RULE é╔âZâbâgé╖éΘ
- ; ò╧Éöé═ gensym é≡Ägé┴é─âRâsü[
- ; É▀é≡âRâsü[é╖éΘé╠é┼Ä└ìsæ¼ôxé═Æxéó
- ; Ælé═âXâyâVâââïò╧Éöé╔èiö[é╖éΘüiæ⌐ö¢âèâXâgé═Ägéφé╚éóüj
- ;
- ; Copyright (C) 1998 by Makoto Hiroi
- ;
-
- ;
- ; ********** É▀é╠ÆΦï` **********
- ;
- (defclass Rule ()
- (var-list ; ò╧ÉöâèâXâg
- clause)) ; É▀
-
- ;
- ; É▀é≡âRâsü[é╖éΘüiò╧Éöé═ gensym é┼Æuè╖é│éΩéΘüj
- ;
- (defmethod copy-clause ((r Rule))
- (with-slots (var-list clause) r
- (sublis
- (if var-list
- (mapcar #'(lambda (var) (cons var (gensym))) var-list))
- clause)))
-
- ;
- ; Rule é≡ì∞éΘ
- ;
- (defun make-rule (clause)
- (make-instance 'Rule
- 'var-list (collect-variable clause nil)
- 'clause clause))
-
- ;
- ; É▀é╠ôoÿ^ clause := ((predicate args ... ) ... )
- ; predicate ÅqîΩé═âVâôâ{âï
- ;
- (defun assert (clause)
- (check-clause clause)
- (let ((predicate (car (car clause))))
- (putprop predicate
- (cons (make-rule clause)
- (get predicate 'RULE))
- 'RULE)))
-
- ;
- ; É▀é╠â`âFâbâN
- ;
- (defun check-clause (clause)
- (dolist (x clause)
- (if (or (variablep (car x))
- (not (symbolp (car x))))
- (error "É▀é╔ÅqîΩé¬éáéΦé▄é╣é± ~A\n" clause))))
-
- ;
- ; âfü[â^é╠âìü[âh : ((p ...) ... ) é╠î`Ä«
- ;
- (defun load-data (filename)
- (let (clause)
- (with-open-file (in filename "r")
- (while (setq clause (read in nil))
- (assert clause)))))
-
- ;
- ; Ä┐ûΓé╖éΘ
- ;
- (defun Q (question)
- (let* ((rule (make-rule question))
- (env (make-env (slot-value rule 'clause)))
- result)
- (while (listp (setq result (exec-clause env)))
- (dolist (var (slot-value rule 'var-list) (terpri))
- (format t "~A = ~A\n" var (variable-value var))))))
-
-
- ;
- ; ********** Ä└ìsè┬ï½é╠ÆΦï` **********
- ;
- (defclass Env ()
- (goal ; âSü[âïÉ▀
- rule-list ; ÅqîΩé╔ÆΦï`é│éΩé─éóéΘïKæÑ
- exec-rule ; Ä└ìsÆåé╠ïKæÑ
- exec-env ; ì∞ɼé╡é╜è┬ï½üiâXâ^âbâNé╔é╚éΘüj
- binding)) ; æ⌐ö¢é╡é╜ò╧Éö
-
-
- ;
- ; Ä└ìsè┬ï½é╠ì∞ɼ
- ;
- (defun make-env (pattern)
- (make-instance 'Env
- 'goal pattern
- 'rule-list (get (car pattern) 'RULE)
- 'binding 'call))
-
- ;
- ; É▀é╠Ä└ìs
- ;
- (defmethod exec-clause ((e Env))
- (with-slots (rule-list binding) e
- (let ((result 'fail))
- (if (eq binding 'call)
- ; ì┼Åëé╠î─é╤Åoé╡
- (if rule-list
- (setq result (select-rule e)))
- ; ì─ÄÄìs
- (if (eq 'fail (setq result (exec-body e)))
- ; ăé╠É▀é≡Ä└ìs
- (setq result (select-rule e))))
- (if (eq result 'fail)
- (clear-binding binding)
- result))))
-
- ;
- ; ô¬òöé╞Å╞ìçé╖éΘïKæÑé≡æIæ≡
- ;
- (defmethod select-rule ((e Env))
- (with-slots (exec-rule exec-env) e
- (let ((result 'fail))
- (while
- (and (listp (setq result (unify-head e)))
- exec-rule)
- (push (make-env (car exec-rule)) exec-env)
- (if (listp (setq result (exec-body e)))
- (return)))
- result)))
-
- ;
- ; ô¬òöé╞é╠âåâjâtâBâPü[âVâçâô
- ;
- (defmethod unify-head ((e Env))
- (with-slots (goal rule-list exec-rule binding) e
- (let ((result 'fail) now-rule)
- ; æ⌐ö¢ò╧Éöé¬éáéΩé╬âNâèâAé╖éΘ
- (clear-binding binding)
- (while rule-list ; ïKæÑé¬éáéΘè╘îJéΦò╘é╖
- ; É▀é≡âRâsü[é╖éΘ
- (setq now-rule (copy-clause (pop rule-list)))
- (when
- ; goal é╞ head é╠Å╞ìç
- (listp (setq result (unify goal (pop now-rule) nil)))
- ; ɼî≈ : É▀é≡Æuè╖é╡æ⌐ö¢é│éΩé╜ò╧Éöé≡ïLë»é╖éΘ
- (setq exec-rule now-rule
- binding result)
- (return)))
- result))) ; îïë╩é≡Åoù═é╖éΘ
-
-
- ;
- ; æ╠òöé╠Ä└ìs
- ;
- (defun exec-body (env)
- (with-slots (exec-env exec-rule) env
- (let ((max-state (length exec-rule))
- (result 'fail)
- now-state)
- ; Ä└ìsè┬ï½é¬é╚é¡é╚éΘé▄é┼îJéΦò╘é╖
- (while exec-env
- (setq result (exec-clause (car exec-env)))
- (cond
- ; Å╞ìçÄ╕ösé═âoâbâNâgâëâbâNé╖éΘüB
- ((eq 'fail result)
- (pop exec-env))
- ; æSé─é╠â}âbâ`âôâOé╔ɼî≈
- ((= max-state (setq now-state (length exec-env)))
- (return))
- ; Å╞ìçɼî≈é═ăé╠É▀é╔Éié▐
- (t (push (make-env (elt exec-rule now-state)) exec-env))))
-
- ; îïë╩é≡Åoù═é╖éΘ
- result)))
-
-
-
- ;
- ; ********** Å╞ìçè╓Éö **********
- ;
- ; OUTPUT -- Ä╕ös : fail, ɼî≈ : æ⌐ö¢é╡é╜âVâôâ{âï
- ;
- (defun unify (pattern datum binding)
- (cond ((variablep pattern)
- (unify-variable pattern datum binding))
- ((variablep datum)
- (unify-variable datum pattern binding))
- ((and (atom pattern) (atom datum))
- (unify-atoms pattern datum binding))
- ((and (consp pattern) (consp datum))
- (unify-pieces pattern datum binding))
- (t (clear-binding binding))))
-
- ;
- ; âAâgâÇé╞é╠âåâjâtâBâPü[âVâçâô
- ;
- (defun unify-atoms (pattern datum binding)
- (if (equal pattern datum)
- binding
- (clear-binding binding)))
-
- ;
- ; âèâXâgé╠âåâjâtâBâPü[âVâçâô
- ;
- (defun unify-pieces (pattern datum binding)
- (let ((result (unify (car pattern) (car datum) binding)))
- (if (eq result 'fail)
- 'fail
- (unify (cdr pattern) (cdr datum) result))))
-
- ;
- ; ò╧Éöé╞é╠âåâjâtâBâPü[âVâçâô
- ;
- (defun unify-variable (var datum binding)
- (if (and (boundp var)
- (not (eq (symbol-value var) var))) ; Ä⌐ò¬Ä⌐Égé┼é═é╚éó
- (unify (symbol-value var) datum binding)
- (add-binding var datum binding))) ; insidep é╠â`âFâbâNé═òsùv
-
- ;
- ; ********** âTâuâïü[â`âô **********
- ;
-
- ;
- ; ò╧Éöé≡â`âFâbâNé╖éΘ
- ;
- (defun variablep (pattern)
- (and (symbolp pattern)
- (upper-case-p (char pattern 0))))
-
- ;
- ; ò╧ÉöÆlé≡âZâbâgé╖éΘ
- ;
- (defun add-binding (var datum binding)
- (set var datum)
- (cons var binding))
-
- ;
- ; ò╧Éöé≡âNâèâAé╡é─ 'fail é≡ò╘é╖
- ;
- (defun clear-binding (binding)
- (if (listp binding)
- (dolist (var binding) (makunbound var)))
- 'fail)
- ;
- ; É▀é┼Ägùpé│éΩé─éóéΘò╧Éöé≡ÅWé▀éΘ
- ;
- (defun collect-variable (clause var-list)
- (cond
- ((variablep clause)
- (pushnew clause var-list))
- ((atom clause) var-list)
- (t
- (collect-variable
- (cdr clause)
- (collect-variable (car clause) var-list)))))
-
-
- ;
- ; ò╧Éöé≡Æuè╖é╖éΘ
- ;
- (defun replace-variable (pattern)
- (cond
- ((variablep pattern)
- (variable-value pattern))
- ((atom pattern) pattern)
- (t
- (cons (replace-variable (car pattern))
- (replace-variable (cdr pattern))))))
-
- ;
- ; ò╧ÉöÆlé≡ïüé▀éΘ
- ;
- (defun variable-value (var)
- (let (value)
- (loop
- (unless (boundp var) (return var)) ; ûóæ⌐ö¢
- (setq value (symbol-value var)) ; âXâyâVâââïò╧Éöé≡ĵéΦÅoé╖
- (cond
- ((eq var value)
- (return value)) ; Ä⌐ò¬Ä⌐Égé¬ôⁿé┴é─éóéΘ
- ((variablep value)
- (setq var value))
- ((consp value) ; Æåé╔ò╧Éöé¬éáéΘé⌐éαé╡éΩé╚éóé╠é┼Æuè╖é╖éΘ
- (return (replace-variable value)))
- (t (return value))))))
-
- ; âeâXâg
- ; âfü[â^é╠âìü[âh
- ;
- ;(load-data "list.dat")
- ;
- ; Ä└ìsùß
- ;(Q '(perm (a b c) Y))
- ;
-
- ; end of file
-